#pragma once
#include <map>
#include <vector>
#include <string>
#include <mutex>
class XServiceProxyClient;
namespace xmsg{class XMsgHead;}
class XMsg;
class XMsgEvent;
class XServiceProxy{
public:
    static XServiceProxy* Get(){
        static XServiceProxy instance;
        return &instance;
    }
    ~XServiceProxy();
    XServiceProxy(const XServiceProxy&)=delete;
    XServiceProxy& operator=(const XServiceProxy&)=delete;
    // 初始化微服务列表（注册中心获取），建立连接
    bool Init();
    // 负载均衡
    bool SendMsg(xmsg::XMsgHead *head, XMsg *message, XMsgEvent* ev);
    // 清理消息回调
    void DelEvent(XMsgEvent* ev);
    // 开启自动重连的线程
    void Start();
    // 停止自动重连的线程
    void Stop();
    // 
    void Main();
private:
    XServiceProxy();
    bool is_exit_ = false;
    // 微服务列表，一个微服务对应一个客户端
    std::map<std::string,std::vector<XServiceProxyClient*>> client_map_;
    // 微服务列表索引
    std::map<std::string,int> client_map_last_index_;
    std::map<XMsgEvent*,XServiceProxyClient*> callbacks_;
    std::mutex callbacks_mutex_;
    std::mutex client_map_mutex_;
};